/**********************************************************************
* Filename: Pais.java
* Created: 2013/05/30
* @author Fernando Brito e Abreu
**********************************************************************/
package org.quasar.airNova.businessLayer;

import org.quasar.airNova.persistenceLayer.Database;

import java.util.Set;
import java.util.HashSet;

public class Pais
{
	
	/***********************************************************
	* @return all instances of class Pais
	***********************************************************/
	public static Set<Pais> allInstances()
	{
		return Database.allInstances(Pais.class);
	}
	
	private Set<Individual> nacionais =  new HashSet<Individual>();
	private int delta_GMT;
	private String lingua;
	private String moeda_oficial;
	private String nome;
	
	/**********************************************************************
	* Default constructor
	**********************************************************************/
	public Pais()
	{
	}
	
	/**********************************************************************
	* Parameterized constructor
	* @param nacionais the nacionais to initialize
	* @param delta_GMT the delta_GMT to initialize
	* @param lingua the lingua to initialize
	* @param moeda_oficial the moeda_oficial to initialize
	* @param nome the nome to initialize
	**********************************************************************/
	public Pais(Set<Individual> nacionais, int delta_GMT, String lingua, String moeda_oficial, String nome)
	{
		this.nacionais = nacionais;
		this.delta_GMT = delta_GMT;
		this.lingua = lingua;
		this.moeda_oficial = moeda_oficial;
		this.nome = nome;
	}
	
	/**********************************************************************
	* MANY2MANY getter for Pais[*] <-> Set(Individual)[*]
	* @return the nacionais of the pais
	**********************************************************************/
	public Set<Individual> nacionais()
	{
		return nacionais;
	}
	
	/**********************************************************************
	* MANY2MANY setter for Pais[*] <-> Set(Individual)[*]
	* @param nacionais the nacionais to set
	**********************************************************************/
	public void setNacionais(Set<Individual> nacionais)
	{
		this.nacionais = nacionais;
	}
	
	/**********************************************************************
	* MANY2MANY single setter for Pais[*] <-> Set(Individual)[*]
	* @param individual the individual to add
	**********************************************************************/
	public void addNacionais(Individual individual)
	{
		this.nacionais.add(individual);
	}
	
	/**********************************************************************
	* Standard attribute getter
	* @return the delta_GMT of the pais
	**********************************************************************/
	public int delta_GMT()
	{
		return delta_GMT;
	}
	
	/**********************************************************************
	* Standard attribute setter
	* @param delta_GMT the delta_GMT to set
	**********************************************************************/
	public void setDelta_GMT(int delta_GMT)
	{
		this.delta_GMT = delta_GMT;
	}
	
	/**********************************************************************
	* Standard attribute getter
	* @return the lingua of the pais
	**********************************************************************/
	public String lingua()
	{
		return lingua;
	}
	
	/**********************************************************************
	* Standard attribute setter
	* @param lingua the lingua to set
	**********************************************************************/
	public void setLingua(String lingua)
	{
		this.lingua = lingua;
	}
	
	/**********************************************************************
	* Standard attribute getter
	* @return the moeda_oficial of the pais
	**********************************************************************/
	public String moeda_oficial()
	{
		return moeda_oficial;
	}
	
	/**********************************************************************
	* Standard attribute setter
	* @param moeda_oficial the moeda_oficial to set
	**********************************************************************/
	public void setMoeda_oficial(String moeda_oficial)
	{
		this.moeda_oficial = moeda_oficial;
	}
	
	/**********************************************************************
	* Standard attribute getter
	* @return the nome of the pais
	**********************************************************************/
	public String nome()
	{
		return nome;
	}
	
	/**********************************************************************
	* Standard attribute setter
	* @param nome the nome to set
	**********************************************************************/
	public void setNome(String nome)
	{
		this.nome = nome;
	}
	
	/**********************************************************************
	* ONE2MANY getter for Pais[1] <-> Cidade[*]
	* @return the cidades of the pais
	**********************************************************************/
	public Set<Cidade> cidades()
	{
		Set<Cidade> result = new HashSet<Cidade>();
		for (Cidade x : Cidade.allInstances())
			if (x.pais()  ==  this)
				result.add(x);
		return result;
	}
	
	/**********************************************************************
	* ONE2MANY multiple setter for Pais[1] <-> Cidade[*]
	* @param cidades the cidades to set
	**********************************************************************/
	public void setCidades(Set<Cidade> cidades)
	{
		for (Cidade x : cidades)
			x.setPais(this);
	}
	
	/**********************************************************************
	* ONE2MANY single setter for Pais[1] <-> Cidade[*]
	* @param cidade the cidade to add
	**********************************************************************/
	public void addCidades(Cidade cidade)
	{
		cidade.setPais(this);
	}
	
	/**********************************************************************
	* Object serializer
	**********************************************************************/
	public String toString()
	{
		return "Pais [nacionais=" + nacionais + ", delta_GMT=" + delta_GMT + ", lingua=" + lingua + ", moeda_oficial=" + moeda_oficial + ", nome=" + nome + "]";
	}
	
	//	-------------------------------------------------------------------------------
	//	INVARIANTS (TODO)
	/*
	inv paisIndividuoNacionalComNifUnico
		self.nacionais->isUnique($elem5 : Individual | $elem5.n_contribuinte)
	
	inv paisNomeUnico
		Pais.allInstances->forAll(p1 : Pais, p2 : Pais | ((p1 <> p2) implies (p1.nome <> p2.nome)))
	
	inv paisUnico
		Pais.allInstances->isUnique(p : Pais | Tuple {nome:p.nome,moeda_oficial:p.moeda_oficial,lingua:p.lingua})
	
	inv cidadeUnica
		not self.cidades->exists(c1 : Cidade, c2 : Cidade | ((c1 <> c2) and (c1.nome = c2.nome)))
	
	*/
}
